package com.mkk.library.utils

import android.util.Log
import java.io.File
import java.io.FileInputStream
import java.text.DecimalFormat

class FileUtils {

    companion object{
        val SIZETYPE_B = 1 //获取文件大小单位为B的double值
        val SIZETYPE_KB = 2 //获取文件大小单位为KB的double值
        val SIZETYPE_MB = 3 //获取文件大小单位为MB的double值
        val SIZETYPE_GB = 4 //获取文件大小单位为GB的double值
        /**
         * 获取文件指定文件的指定单位的大小
         * @param filePath 文件路径
         * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
         * @return double值的大小
         */
        fun getFileOrFilesSize(filePath: String?, sizeType: Int): Double {
            val file = File(filePath)
            var blockSize: Long = 0
            try {
                blockSize = if (file.isDirectory) {
                    getFileSizes(file)
                } else {
                    getFileSize(file)
                }
            } catch (e: java.lang.Exception) {
                e.printStackTrace()
                Log.e("获取文件大小", "获取失败!")
            }
            return FormetFileSize(blockSize, sizeType)
        }

        /**
         * 获取文件大小,指定计量单位
         * @param fileS
         * @param sizeType
         * @return
         */
        private fun FormetFileSize(fileS: Long, sizeType: Int): Double {
            val df = DecimalFormat("#.00")
            var fileSizeLong = 0.0
            when (sizeType) {
                SIZETYPE_B -> fileSizeLong = java.lang.Double.valueOf(df.format(fileS.toDouble()))
                SIZETYPE_KB -> fileSizeLong = java.lang.Double.valueOf(df.format(fileS.toDouble() / 1024))
                SIZETYPE_MB -> fileSizeLong = java.lang.Double.valueOf(df.format(fileS.toDouble() / 1048576))
                SIZETYPE_GB -> fileSizeLong = java.lang.Double.valueOf(df.format(fileS.toDouble() / 1073741824))
            }
            return fileSizeLong
        }


        /**
         * 获取指定文件大小
         *
         * @param f
         * @return
         * @throws Exception
         */
        @Throws(Exception::class)
        private fun getFileSize(file: File): Long {
            var size: Long = 0
            if (file.exists()) {
                var fis: FileInputStream? = null
                fis = FileInputStream(file)
                size = fis.available().toLong()
            } else {
                file.createNewFile()
                Log.e("获取文件大小", "文件不存在!")
            }
            return size
        }

        /**
         * 获取指定文件夹
         * @param f
         * @return
         * @throws Exception
         */
        @Throws(Exception::class)
        private fun getFileSizes(f: File): Long {
            var size: Long = 0
            val flist = f.listFiles()
            for (i in flist.indices) {
                size = if (flist[i].isDirectory) {
                    size + getFileSizes(flist[i])
                } else {
                    size + getFileSize(flist[i])
                }
            }
            return size
        }
    }


}
